/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufrn.dca.controlelrl;

import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;

import br.ufrn.dca.controle.QuanserClient;
import br.ufrn.dca.controle.QuanserClientException;
import br.ufrn.dca.gui.TelaPrincipal;


/**
 *
 * @author Victor
 */
public class ControleLRL {

    private static ControleLRL controleLRL;
    private TanqueMalhaAberta tanqueMalhaAberta;
    private TanqueMalhaFechada tanqueMalhaFechada;
    private static TelaPrincipal principal1;
    private static QuanserClient quanserClient;
//    private String endereco = "localhost";
    private String endereco = "10.13.99.69";
    private int porta = 20081;
    private static boolean emExecucao;
    private static boolean graficoPaused;
    
	public QuanserClient getQuanserClient() {
		if (quanserClient == null)
			quanserClient = conectarQuanser();
		
		return quanserClient;
	}
	
	public QuanserClient conectarQuanser(){
		try {
			quanserClient = new QuanserClient(getEndereco(), getPorta());
			return quanserClient;
		} catch (QuanserClientException e) {
			e.printStackTrace();
		}
		return null;
	}
	
    
    public TelaPrincipal getTelaPrincipal() {
        if (principal1 == null)
            principal1 = new TelaPrincipal(this);
            
        return principal1;
    }

    private ControleLRL() {
    }
    
    public static ControleLRL getInstance(){
        if (controleLRL == null)
            controleLRL = new ControleLRL();
        
        return controleLRL;
    }
    
    public void inicializarTanqueMalhaAberta(int signalType) {
    	if (tanqueMalhaAberta != null)
    		tanqueMalhaAberta.stop();
    	
    	tanqueMalhaAberta = new TanqueMalhaAberta(100, getTelaPrincipal().getTelaMalhaAberta());
        getTelaPrincipal().getTelaMalhaAberta().limparGrafico();
        tanqueMalhaAberta.setMaxAmp(Double.parseDouble(getTelaPrincipal().getTelaMalhaAberta().getAmpMax().getText())/5);
        tanqueMalhaAberta.setMinAmp(Double.parseDouble(getTelaPrincipal().getTelaMalhaAberta().getAmpMin().getText())/5);
        tanqueMalhaAberta.setPeriod(Double.parseDouble(getTelaPrincipal().getTelaMalhaAberta().getPeriodo().getText()));
        tanqueMalhaAberta.setSignalType(signalType);
        tanqueMalhaAberta.start();
        
        emExecucao = true;
    }
    
    public void inicializarTanqueMalhaFechada(int tipoControlador1, int tipoControlador2, double setpoint, double kp, double ki, double kd
    		,double kp2, double ki2, double kd2, int canalEscrita, int canalLeitura, boolean cascata, Observador observador, Seguidor seguidor) {
    	if (tanqueMalhaFechada != null)
    		tanqueMalhaFechada.stop();
    	
        tanqueMalhaFechada = new TanqueMalhaFechada(100, getTelaPrincipal().getTelaMalhaFechada());
        tanqueMalhaFechada.setTipoControlador1(tipoControlador1);
        tanqueMalhaFechada.setSetpoint(setpoint);
        tanqueMalhaFechada.setKp(kp);
        tanqueMalhaFechada.setKi(ki);
        tanqueMalhaFechada.setKd(kd);
        tanqueMalhaFechada.setCanalEscrita(canalEscrita);
        tanqueMalhaFechada.setCanalLeitura(canalLeitura);
        tanqueMalhaFechada.setCascata(cascata);
        if (cascata) {
        	tanqueMalhaFechada.setTipoControlador2(tipoControlador2);
        	tanqueMalhaFechada.setKp2(kp2);
            tanqueMalhaFechada.setKi2(ki2);
            tanqueMalhaFechada.setKd2(kd2);
		}
        
        tanqueMalhaFechada.setObservador(observador);
        tanqueMalhaFechada.setSeguidor(seguidor);
        
        tanqueMalhaFechada.start();
        
        emExecucao = true;
        
    }
    
    
    public void limparGraficoMalhaFechada(){
    	if (tanqueMalhaFechada != null)
    		tanqueMalhaFechada.limparGrafico();
    }
    
    public void printGraficoMalhaFechada(File destino, JFreeChart graficoAsalvar){
    	try {
	    	salvarGrafico(destino, graficoAsalvar);
		} catch (IOException e) {
			TanqueMalhaFechada.escreverQuanser(tanqueMalhaFechada.getCanalEscrita(), 0);
			e.printStackTrace();
		}
    }

	private void salvarGrafico(File destino, JFreeChart graficoAsalvar)
			throws IOException {
		String path = destino.getPath();
		
		if (!path.contains(".png") && !path.contains(".PNG"))
			path += ".png";

		ChartUtilities.saveChartAsPNG(new File(path), graficoAsalvar, 1024, 480);
	}

	public void interromperTanqueEmExecucao(boolean pararTimer) {
		emExecucao = false;
		
		if (pararTimer) {
			try {
				if (tanqueMalhaFechada != null) {
					getQuanserClient().write(0, 0);
		    		tanqueMalhaFechada.stop();
		    		tanqueMalhaFechada = null;
				}
				if (tanqueMalhaAberta != null) {
					getQuanserClient().write(0, 0);
		    		tanqueMalhaAberta.stop();
		    		tanqueMalhaAberta = null;
				}
			} catch (QuanserClientException e) {
				e.printStackTrace();
			}
		}
	}

	public static boolean isEmExecucao() {
		return emExecucao;
	}
	
	public static boolean isGraficoPaused() {
		return graficoPaused;
	}

	private void carregarLookAndFeel() {
		try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
	}
	
	public static void main(String args[]) {
		getInstance().carregarLookAndFeel();
		getInstance().getTelaPrincipal().setVisible(true);
	}

	public void configurar(String endereco, int porta) {
		setEndereco(endereco);
		setPorta(porta);
		
		if (emExecucao)
			interromperTanqueEmExecucao(true);
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public int getPorta() {
		return porta;
	}

	public void setPorta(int porta) {
		this.porta = porta;
	}

	public void pauseGraficoTanqueMalhaFechada(boolean selected) {
		graficoPaused = selected;
	}
	
}
